// 导入koa，和koa 1.x不同，在koa2中，我们导入的是一个class，因此用大写的Koa表示:
var Koa = require("koa");

// 创建一个Koa对象表示web app本身:
const app = new Koa();
const bodyParser = require('koa-bodyparser')()

const controller = require("./controller.js")();

let templating = require('./templating');

var port = 3000;

// Node.js在全局变量process中定义了一个环境变量env.NODE_ENV
const isProduction = process.env.NODE_ENV === 'production';

// 记录URL以及页面执行时间：
app.use(async(ctx, next) => {

    console.log(`Process ${ctx.method} ${ctx.url}...`);

    console.log(`${ctx.hostname},,,,,,${ctx.ips}`, ctx.state)

    var
        start = new Date().getTime(),
        execTime;

    /**
     * 判断ctx.state.user是否存在,如果不存在就抛出错误
     * 比如  ctx.state.user="1111111111111"，那么就不会报错
     */
    ctx.throw(500, 'name required', { user: 11111});

    ctx.assert(ctx.state.user, 401, 'User not found. Please login!');

    await next();
    
    execTime = new Date().getTime() - start;
    ctx.response.set('X-Response-Time', `${execTime}ms`);

});

// 出来 post 请求中 body 的参数
app.use(bodyParser);

/**
 * 在生产环境下，静态文件是由部署在最前面的反向代理服务器（如Nginx）处理的
 * Node程序不需要处理静态文件。而在开发环境下，我们希望koa能顺带处理静态文件
 */
if (!isProduction) {
    let staticFiles = require('./static-files');
    app.use(staticFiles('/static/', __dirname + '/static'));
}

/**
 * 判断当前环境是否是production环境。如果是，就使用缓存，如果不是，就关闭缓存
 * 并且给 ctx 绑定 render 函数，让 ctx 可以直接 渲染出内容，不用 额外引用 env 去 渲染，然后又赋值给 ctx.response.body，这样太麻烦了
 */
app.use(templating('views', {
    noCache: !isProduction,
    watch: !isProduction
}));

app.use(controller)

app.on('error', err => {
    // log.error('server error', err)
});

app.listen(port);

console.log(`\n服务器监听着----${port}\n`)